//package org.example;
//
//import javax.swing.*;
//import java.awt.*;
//import java.awt.image.BufferedImage;
//
//class CustomPanel2 extends JPanel {
//    public enum Mode { ROTATE, CROP, TRANSLATE }
//
//    private BufferedImage image;
//    private String imageFileName;
//    private Mode mode = Mode.ROTATE;
//    private double scale = 1.0;
//    private double rotationAngle = 0;
//    private double translateX = 0;
//    private double translateY = 0;
//    private Point startPoint = null;
//    private Point endPoint = null;
//
//    public CustomPanel2() {
//        addMouseListener(new MouseAdapter() {
//            @Override
//            public void mousePressed(MouseEvent e) {
//                startPoint = e.getPoint();
//                endPoint = null;
//            }
//
//            @Override
//            public void mouseReleased(MouseEvent e) {
//                if (mode == Mode.CROP && startPoint != null && endPoint != null) {
//                    cropImage();
//                }
//                startPoint = null;
//                endPoint = null;
//                repaint();
//            }
//        });
//
//        addMouseMotionListener(new MouseMotionAdapter() {
//            @Override
//            public void mouseDragged(MouseEvent e) {
//                endPoint = e.getPoint();
//                if (mode == Mode.TRANSLATE && startPoint != null) {
//                    translateX += e.getX() - startPoint.x;
//                    translateY += e.getY() - startPoint.y;
//                    startPoint = e.getPoint();
//                }
//                repaint();
//            }
//        });
//
//        addMouseWheelListener(new MouseWheelListener() {
//            @Override
//            public void mouseWheelMoved(MouseWheelEvent e) {
//                double delta = 0.05 * e.getPreciseWheelRotation();
//                scale += delta;
//                scale = Math.max(0.1, scale);
//                repaint();
//            }
//        });
//    }
//
//    public void setImage(BufferedImage image) {
//        this.image = image;
//        repaint();
//    }
//
//    public BufferedImage getImage() {
//        return image;
//    }
//
//    public void setImageFileName(String fileName) {
//        this.imageFileName = fileName;
//    }
//
//    public String getImageFileName() {
//        return imageFileName;
//    }
//
//    public BufferedImage getTransformedImage() {
//        if (image != null) {
//            int width = image.getWidth();
//            int height = image.getHeight();
//
//            BufferedImage transformedImage = new BufferedImage(width, height, image.getType());
//            Graphics2D g2d = transformedImage.createGraphics();
//            AffineTransform transform = new AffineTransform();
//            transform.translate(width / 2, height / 2);
//            transform.rotate(rotationAngle);
//            transform.scale(scale, scale);
//            transform.translate(-width / 2, -height / 2);
//            transform.translate(translateX, translateY);
//            g2d.drawImage(image, transform, null);
//            g2d.dispose();
//            return transformedImage;
//        }
//        return null;
//    }
//
//    public void resetTransforms() {
//        scale = 1.0;
//        translateX = 0;
//        translateY = 0;
//        rotationAngle = 0;
//    }
//
//    public void setMode(Mode mode) {
//        this.mode = mode;
//    }
//
//    public void clearImage() {
//        image = null;
//        repaint();
//    }
//
//    private void cropImage() {
//        if (startPoint != null && endPoint != null && image != null) {
//            int x = (int) Math.min(startPoint.x / scale - translateX, endPoint.x / scale - translateX);
//            int y = (int) Math.min(startPoint.y / scale - translateY, endPoint.y / scale - translateY);
//            int width = (int) Math.abs(startPoint.x / scale - endPoint.x / scale);
//            int height = (int) Math.abs(startPoint.y / scale - endPoint.y / scale);
//
//            // Ensure the crop rectangle is within the bounds of the image
//            x = Math.max(0, x);
//            y = Math.max(0, y);
//            width = Math.min(image.getWidth() - x, width);
//            height = Math.min(image.getHeight() - y, height);
//
//            if (width > 0 && height > 0) {
//                image = image.getSubimage(x, y, width, height);
//            }
//        }
//    }
//
//    @Override
//    protected void paintComponent(Graphics g) {
//        super.paintComponent(g);
//        if (image != null) {
//            Graphics2D g2d = (Graphics2D) g.create();
//            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
//            g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
//            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
//
//            AffineTransform transform = new AffineTransform();
//            transform.translate(translateX, translateY);
//            transform.scale(scale, scale);
//            transform.rotate(rotationAngle, image.getWidth() / 2.0, image.getHeight() / 2.0);
//
//            int x = (getWidth() - image.getWidth()) / 2;
//            int y = (getHeight() - image.getHeight()) / 2;
//
//            g2d.drawImage(image, transform, null);
//
//            if (mode == Mode.CROP && startPoint != null && endPoint != null) {
//                int cropX = (int) Math.min(startPoint.x, endPoint.x);
//                int cropY = (int) Math.min(startPoint.y, endPoint.y);
//                int cropWidth = (int) Math.abs(startPoint.x - endPoint.x);
//                int cropHeight = (int) Math.abs(startPoint.y - endPoint.y);
//
//                g2d.setColor(Color.RED);
//                g2d.setStroke(new BasicStroke(2));
//                g2d.drawRect(cropX, cropY, cropWidth, cropHeight);
//            }
//
//            g2d.dispose();
//        }
//    }
//}